package innerclass;


import static net.mindview.util.Print.*;

interface Incrementable{
 void increment();
}

class Callee1 implements Incrementable{//被召唤者1
    private int i=0;
    public void increment(){
        i++;
        print(i);
    }
}

class MyIncrement{
    public void increment(){print("Other operation");}
    static void f(MyIncrement mi){mi.increment();}
}

//---------------------------------------------//
class Callee2 extends MyIncrement{//被叫者2
    private int i=0;

    public void increment(){//重写
        super.increment();
        i++;
        print(i);
    }
    private class Closure implements Incrementable{//内部类实现 最上面的接口
        public void increment(){//与外围类的方法相互独立
            Callee2.this.increment();//用.this调用外围类的increment方法
        }
    }

    Incrementable getCallbackReference(){//接口下的方法，
        return new Closure();
    }

}

class Caller{//呼叫者
    private Incrementable callbackReference;//接口字段
    Caller(Incrementable cbh){
        callbackReference=cbh;
    }
    void go(){
        callbackReference.increment();//调用接口的方法
    }
}



